// Copied from https://gist.github.com/bengourley/c3c62e41c9b579ecc1d51e9d9eb8b9d2


//
// This program reads a sourcemap from stdin
// and replaces the "mappings" property with
// human readable content. It writes the output
// to stdout.
// 
// 1. install the dependencies:
//    npm i concat-stream vlq
//
// 2. optional: install jq for pretty printing json
//
// 3. run the command like so:
//
//      cat my-source-map.js.map | node decode | jq .
//

const concat = require('concat-stream')
const vlq = require('./vlq')

const formatMappings = (mappings, sources, names) => {
    const vlqState = [0, 0, 0, 0, 0]
    return mappings.split(';').reduce((accum, line, i) => {
        accum[i + 1] = formatLine(line, vlqState, sources, names)
        vlqState[0] = 0
        return accum
    }, {})
}

const formatLine = (line, state, sources, names) => {
    const segs = line.split(',')
    return segs.map(seg => {
        if (!seg) return ''
        const decoded = vlq.decode(seg)
        for (var i = 0; i < 5; i++) {
            state[i] = typeof decoded[i] === 'number' ? state[i] + decoded[i] : state[i]
        }
        return formatSegment(...state.concat([sources, names]))
    })
}

const formatSegment = (col, source, sourceLine, sourceCol, name, sources, names) =>
    `${col + 1} => ${sources[source]} ${sourceLine + 1}:${sourceCol + 1}${names[name] ? ` ${names[name]}` : ``}`

process.stdin.pipe(concat((json) => {
    const map = JSON.parse(json)
    process.stdout.write(JSON.stringify({
        ...map,
        mappings: formatMappings(map.mappings, map.sources, map.names)
    }))
}))
